// 实现一个EventEmitter 发布订阅模式真题
// 1.创建一个EventEmitter，承担全局事件总线
// 2.实现on监听事件的方法
// 3.实现emit订阅事件方法

class EventEmitter {
    constructor() {
        // 存储事件和回调的映射关系
        this.handlers = {}
    }

    on(eventName, cb) {
        if (!this.handlers[eventName]) {
            this.handlers[eventName] = []
        }
        this.handlers[eventName].push(cb)
    }

    emit(eventName, ...args) {
        if (this.handlers[eventName]) {
            this.handlers[eventName].forEach(callback => {
                callback(...args)
            })
        }
    }

    off(eventName, cb) {
        const callbakcs = this.handlers[eventName]
        const index = callbakcs.indexOf(cb)
        if (index !== -1) {
            callbakcs.splice(index, 1)
        }
    }

    once(eventName, cb) {
        const wrapper = (...args) => {
            cb.apply(...args)
            this.off(eventName, cb)
        }
        this.on(eventName, wrapper)
    }
}
